package com.warm.mybatis.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.warm.mybatis.dao.BaseRoleDao;
import com.warm.mybatis.entity.BaseRoleEntity;
import com.warm.mybatis.service.BaseRoleService;
import com.warm.mybatis.service.BaseUserService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.Random;

/**
 * @Transcational 事务测试
 */
@Service
public class TranscationServiceImpl {

    @Resource
    BaseUserService baseUserService;
    @Resource
    BaseRoleService baseRoleService;
    @Resource
    TranscationServiceImpl transcationService;

    /**
     * 声明式事务的作用范围：添加注解的方法
     */
    @Transactional
    public void test1(){
        // (0) 当前方法开启事务
        // 1.当前类方法抛出异常 -- 生效
        //baseUserService.insertUserNoTr();
        //throw new RuntimeException();
        // 2.调用类方法抛出异常 -- 生效
        //baseUserService.insertUserNoTrThrow();
        // 3.捕获调用类异常 -- 需要手动回滚
        /*try{
            baseUserService.insertUserNoTrThrow();
        }catch (RuntimeException e){
            baseRoleService.insertRoleNoTr();
        }*/


        // (1) 当前方法不开启事务
        // 1.调用当前类开启事务的方法, 当前方法里抛异常 -- 不生效
        //curTr1();
        //throw new RuntimeException();
        // 2.调用当前类开启事务的方法, 调用方法里抛异常 -- 不生效
        //curTr2();
        // 3.通过注入自己, 然后调用开启事务的方法, 方法里抛异常 -- 生效
        /* 声明式事务 AOP 导致 */
        //transcationService.curTr2();
        // 4.调用其他类开启事务的方法 -- 生效
        //baseUserService.insertUserTrThrow();
        // 5.捕获其他类开启事务异常的方法 -- 不生效
        /*try{
            baseUserService.insertUserTrThrow();
        }catch (RuntimeException e){
            baseRoleService.insertRoleNoTr();
        }*/


        // (3) 都开启事务
        // 1.调用其他类开启事务并捕获异常的方法 -- 不生效(调用类手动回滚)
        //baseUserService.insertUserTrCatch();
    }

    @Transactional
    public void curTr1(){
        baseUserService.insertUserNoTr();
    }

    @Transactional
    public void curTr2(){
        baseUserService.insertUserNoTr();
        throw new RuntimeException();
    }
}
